package com.liuyjy.redis.util;


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.context.annotation.Configuration;

import javax.annotation.Resource;

/**
 * @author: liuyjy
 * @Description: redis封装方法
 * @date: 2022/2/10 16:34
 */
@Slf4j
@Configuration
public class RedissonCacheImpl implements RedissonCache {

    public static final String REDISSON_LOCKKEY = "redissonLock:";

    @Resource
    private RedissonClient redissonClient;

    /**
     * 根据给定的键获取一个Redisson分布式锁对象
     * 此方法不涉及锁的获取与释放，仅返回锁对象，用于后续的操作
     * rLock.tryLock 非阻塞
     * rLock.lock() 阻塞
     * rLock.unlock() 释放锁
     *
     * @param k    锁的唯一标识符，通常与业务相关，用于区分不同的锁
     * @param subK 子键，用于进一步细化锁的粒度
     * @return RLock锁对象，用于执行后续的锁操作
     * @throws IllegalStateException 如果键或子键为空，则抛出此异常
     */
    @Override
    public RLock getRLock(String k, String subK) {
        // 组合键和子键以形成完整的键
        String key = Utils.getKey(k, subK);
        return getRLock(key);
    }

    /**
     * 根据给定的键获取一个Redisson分布式锁对象
     * 此方法不涉及锁的获取与释放，仅返回锁对象，用于后续的操作
     * rLock.tryLock 非阻塞
     * rLock.lock() 阻塞
     * rLock.unlock() 释放锁
     *
     * @param key 锁的唯一标识符，通常与业务相关，用于区分不同的锁
     * @return RLock锁对象，用于执行后续的锁操作
     */
    @Override
    public RLock getRLock(String key) {
        if (StringUtils.isBlank(key)) {
            throw new IllegalStateException("getRLock() key is null");
        }
        // 构造Redisson锁的键，通过拼接固定的前缀与传入的键值来避免键名冲突
        String lockKey = REDISSON_LOCKKEY + key;
        if (null == redissonClient) {
            throw new IllegalStateException("getRLock() 你忘了配置Redisson连接了！");
        }
        try {
            // 调用Redisson客户端的getLock方法，根据锁键获取RLock对象并返回
            return redissonClient.getLock(lockKey);
        } catch (Exception e) {
            // 记录异常日志
            log.error("获取锁时发生异常:{}", e.getMessage());
            // 可以选择抛出自定义异常或返回 null
            throw new RuntimeException("获取锁时发生异常", e);
        }
    }


}
